package com.firmye.codereposboot.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author firmye
 * @Date 2017年11月7日 上午9:36:30
 *
 * @Description 随机工具类
 */
public class RandomUtil {

	/**
	 * @Author firmye
	 * @Date 2017年11月7日 上午9:43:09
	 *
	 * @Description 获取随机指定范围[min, max]的随机浮点数，精确到0.01
	 */
	public static Double getDouble(Double min, Double max) {
		// return Double.valueOf(
		// new BigDecimal(Math.random() * (max - min) + min).setScale(2,
		// BigDecimal.ROUND_HALF_UP).toString());

		int i_min = (int) (min * 100), i_max = (int) (max * 100);
		int ri = getInteger(i_min, i_max);
		return Double.valueOf(ri) / 100d;
	}

	/**
	 * @Author firmye
	 * @Date 2017年11月21日 下午3:31:06
	 *
	 * @Description 获取指定范围[min, max]的随机数
	 */
	public static Long getLong(Long min, Long max) {
		if (min == max)
			return min;
		Long rl = new Random().nextLong();
		if (rl < 0)
			rl = rl * -1;
		return rl % (max - min + 1) + min;
	}

	/**
	 * @Author firmye
	 * @Date 2017年11月17日 上午9:12:14
	 *
	 * @Description 获取指定范围[min, max]的随机数
	 */
	public static Integer getInteger(Integer min, Integer max) {
		if (min == max)
			return min;
		Integer ri = new Random().nextInt();
		if (ri < 0)
			ri = ri * -1;
		return ri % (max - min + 1) + min;
	}

	/**
	 * @Author firmye
	 * @Date 2017年11月17日 上午9:12:05
	 *
	 * @Description 是否中奖
	 */
	public static boolean isPrized(Integer percentage) {
		Integer num = getInteger(0, 99);
		if (num < percentage) {
			return true;
		}
		return false;
	}

	/**
	 * @Author firmye
	 * @Date 2017年11月21日 下午5:30:30
	 *
	 * @Description 抽出其中一个，概率精确到0.01
	 */
	public static String whichPrized(Map<Double, String> map) throws Exception {
		Double num = getDouble(0d, 99.99);

		Double tp = 0d;
		List<Double> doubles = new ArrayList();
		for (Double d : map.keySet()) {
			tp += d;
			doubles.add(d);
		}

		if (tp > 100) {
			throw new Exception("中奖概率超出100%");
		}

		for (int i = 0; i < doubles.size(); i++) {
			for (int j = i + 1; j < doubles.size(); j++) {
				if (doubles.get(i) > doubles.get(j)) {
					double tmp = doubles.get(i);
					doubles.set(i, doubles.get(j));
					doubles.set(j, tmp);
				}
			}
		}

		tp = 0d;
		for (int i = 0; i < doubles.size(); i++) {
			// tn += Integer.valueOf((int) (doubles.get(i) * 100));
			tp += doubles.get(i);
			if (num < tp)
				return map.get(doubles.get(i));
		}

		return null;
	}

	/**
	 * @Author firmye
	 * @Date 2017年11月21日 下午3:19:30
	 *
	 * @Description 获取指定范围内的时间，时间格式为yyyy-MM-dd HH:mm:ss
	 */
	public static Date getRandomDate(String minStr, String maxStr) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date min = sdf.parse(minStr);
		Date max = sdf.parse(maxStr);

		return new Date(min.getTime() + getLong(0L, max.getTime() - min.getTime()));
	}

	public static void main(String[] args) throws Exception {

		/*int num1 = 0, num2 = 0, num3 = 0;
		for (int i = 0; i < 10000000; i++) {
			// int t = getInteger(0, 9999);
			Double t = getDouble(0d, 99.99);
			if (t == 12.77) {
				num1++;
			}
			if (t == 99.99) {
				num2++;
			}
			if (t < 0 || t > 99.99) {
				num3++;
			}
		}
		System.out.println(num1);
		System.out.println(num2);
		System.out.println(num3);
		System.out.println(Long.MAX_VALUE);*/

		int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
		Map map = new HashMap();
		map.put(0.01, "1");
		map.put(0.99, "2");
		map.put(1d, "3");
		map.put(98d, "4");
		for (int i = 0; i < 10000; i++) {
			String str = whichPrized(map);
			if ("1".equals(str)) {
				num1++;
			}
			if ("2".equals(str)) {
				num2++;
			}
			if ("3".equals(str)) {
				num3++;
			}
			if ("4".equals(str)) {
				num4++;
			}
		}
		System.out.println(num1);
		System.out.println(num2);
		System.out.println(num3);
		System.out.println(num4);

		System.out.println(getRandomDate("2018-01-01 00:00:00","2018-09-03 23:59:59"));

	}

}
